/* programa testado
 * program numerosPerfeitos;
  
 uses crt;
 
 var
 ate, x, soma, i: integer;
 
 begin
 clrscr;
 x := 0;
 writeln('Numeros perfeitos abaixo de');
 Readln(ate);
 repeat
 x := x + 1;
 soma := 0;
 for i := 1 to x - 1 do
 begin
 if x mod i = 0 then
 soma := soma + i;
 end;
 if soma = x then
 begin
 writeln(x);
 end;
 until (x > ate);
 writeln('Pressione qualquer tecla para finalizar…');
 readkey;
 end.
 */
package model;

import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Dikson
 */
public class AnalisadorLexico {

    String codigo;
    String palavra = "";
    int index;
    ArrayList<String> palavraReservada = new ArrayList();
    ArrayList<String> tabela = new ArrayList();
    ArrayList<String> tokens1 = new ArrayList();
    ArrayList<String> tokens2 = new ArrayList();
    ArrayList<String> tokens3 = new ArrayList();

    public AnalisadorLexico(String pCodigo) {
        this.codigo = pCodigo;

    }

    public void adicionaToken() {
        palavraReservada.add("program");
        palavraReservada.add("begin");
        palavraReservada.add("end");
        palavraReservada.add("write");
        palavraReservada.add("read");
        palavraReservada.add("if");
        palavraReservada.add("else");
        palavraReservada.add("do");
        palavraReservada.add("while");
        palavraReservada.add("var");
        palavraReservada.add("false");
        palavraReservada.add("true");
        palavraReservada.add("procedure");
        palavraReservada.add("function");
        palavraReservada.add("then");
        palavraReservada.add("or");
        palavraReservada.add("and");
        palavraReservada.add("integer");
        palavraReservada.add("read");
        palavraReservada.add("const");
        palavraReservada.add("char");
        palavraReservada.add("string");
        palavraReservada.add("real");
        palavraReservada.add("repeat");
        palavraReservada.add("break");
        palavraReservada.add("continue");
        palavraReservada.add("until");
    }

    public void analisaCodigo() {
        index = 0;

        while (index < codigo.length()) {

            if (!codigo.isEmpty()) {

                if (Character.isWhitespace(codigo.charAt(index))) {
                    if (palavraReservada.contains(palavra)) {
                        tabela.add(palavra);
                    } else {
                        addToken(palavra);
                    }
                    palavra = "";
                    proximaChar();

                } else if (Character.isLetterOrDigit(codigo.charAt(index))) {
                    palavra += codigo.charAt(index);
                    proximaChar();
                } else {
                    addToken(palavra);
                    palavra = "";
                    tabela.add(Character.toString(codigo.charAt(index)));
                    proximaChar();
                }
            }
        }

        trataAspas();
        trataAtribuicao();
        trataComparador();
        setLexema();
    }

    public char charAtual() {
        return this.codigo.charAt(index);
    }

    public void proximaChar() {
        this.codigo.charAt(index++);
    }

    public void addToken(String token) {

        if (!token.isEmpty()) {
            tabela.add(token);
        }
    }

    public void trataAspas() {
        Iterator it = tabela.iterator();
        String palavra = "";
        String literal = "";

        while (it.hasNext()) {
            literal = (String) it.next();
            if (literal.equals("'")) {
                palavra += literal;
                literal = (String) it.next();
                while (!literal.equals("'")) {
                    palavra += literal;
                    literal = (String) it.next();
                    if (!literal.equals("'")) {
                        palavra += " ";
                    }
                }
                palavra += literal;
                tokens1.add(palavra);
                palavra = "";
                literal = (String) it.next();
            }
            tokens1.add(literal);
        }
    }

    public void trataAtribuicao() {
        Iterator it = tokens1.iterator();
        String palavra = "";
        String literal = "";

        while (it.hasNext()) {
            literal = (String) it.next();
            if (literal.equals(":")) {
                palavra += literal;
                literal = (String) it.next();
                if (literal.equals("=")) {
                    palavra += literal;
                }
                tokens2.add(palavra);
                literal = (String) it.next();
            }
            tokens2.add(literal);
            palavra = "";
        }
    }

    public void trataComparador() {
        Iterator it = tokens2.iterator();
        String palavra = "";
        String literal = "";

        while (it.hasNext()) {
            literal = (String) it.next();
            if (literal.equals("<")) {
                palavra += literal;
                literal = (String) it.next();
                if (literal.equals("=")) {
                    palavra += literal;
                }
                tokens3.add(palavra);
            } else if (literal.equals(">")) {
                palavra += literal;
                literal = (String) it.next();
                if (literal.equals("=")) {
                    palavra += literal;
                }
                tokens3.add(palavra);
                literal = (String) it.next();
            }
            tokens3.add(literal);
            palavra = "";
        }
    }

    public void setLexema() {
        int i = 0;
        TabelaSimbolo tb = new TabelaSimbolo();
        Iterator it = tokens3.iterator();
        String palavra = "";
        while (it.hasNext()) {
            palavra = (String) it.next();
            System.out.println(palavra);
            tb.analisa(palavra);
        }
    }
}
